//javadoc pendent de fer.
/**
 * @author Jordi Sabater
 */
package com.bonshotels.PresentationLayer;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import com.bonshotels.DomainLayer.DomainControllers.CUReservarHabitacio;
import com.bonshotels.Excepcions.ClientNoExisteix;
import com.bonshotels.Excepcions.HabitacioNoExisteix;
import com.bonshotels.Excepcions.HotelNoExisteix;
import com.bonshotels.Excepcions.HotelsNoDisp;
import com.bonshotels.Excepcions.NoHiHaPoblacions;
import com.bonshotels.Excepcions.PoblacioNoExisteix;
import com.bonshotels.Excepcions.ServeiNoDisponible;

public class CtrlReservarHabitacio {

	private VistaReservarHabitacio vrh;
	private CUReservarHabitacio curh;
	private Set<Map<String, Object> > hotels;
	
	public CtrlReservarHabitacio() {
		curh = new CUReservarHabitacio();
		vrh = new VistaReservarHabitacio(this);
		try {
			Set<String> pobs = curh.obtePoblacions();
			vrh.mostraFinestraCerca(pobs);
		} catch(NoHiHaPoblacions exc) {
			vrh.mostraError(exc.getMessage(), "Contacteu el vostre administrador.");
		}
		
	}
	
	public void surtDialegModal() {
		vrh.tornaFinestraCerca();
	}
	
	public void surtCasUs() {
		vrh.tanca();
		
	}
	
	public void surtWizardIdentificacio() {
		vrh.tornaFinestraWizardIdentificacio();
	}
	
	public void surtWizardPagament() {
		vrh.tornaFinestraWizardPagament();
	}
	
	//falta una excepcio, comentar la projeccio
	public void cerca(String pob, Date dIni, Date dFi, int numOcup) {
		if(dIni.before(dFi) && !((dIni.getDate() == dFi.getDate()) && 
				(dIni.getMonth() == dFi.getMonth()) && (dIni.getYear() == dFi.getYear()))) {
			try {
				hotels = curh.buscarHabitacio(pob, dIni, dFi, numOcup);
				Set<Map<String, Object> > dadesHotels = new HashSet<Map<String, Object> >();
				for(Map<String, Object> hotel : hotels) {
					Map<String, Object> dadesHotel = new TreeMap<String, Object>();
					dadesHotel.put("nomHotel", hotel.get("nomHotel"));
					dadesHotel.put("categoria", hotel.get("categoria"));
					dadesHotel.put("avaluacio", hotel.get("avaluacio"));
					dadesHotels.add(dadesHotel);
				}
				vrh.actualitzaCerca(dadesHotels);
			} catch (HotelsNoDisp exc) {
				vrh.mostraMissatge(exc.getMessage(), "");
			} catch (PoblacioNoExisteix exc) {
				vrh.mostraMissatge(exc.getMessage(), "");
			}
		} else {
			vrh.mostraMissatge("La data d'arribada �s posterior o igual a la de sortida",
			  "Modifiqui-les de manera que aix� no passi.");
		}
	}
	
	//implementacio seleccio i projeccio
	public void hotelSeleccionat(String nomHotel) {
		Map<String, Object> hotelSeleccionat = null;
		Iterator<Map<String, Object> > iHotels = hotels.iterator();
		boolean trobat = false;
		while(iHotels.hasNext() && !trobat) {
			hotelSeleccionat = iHotels.next();
			if(nomHotel.compareTo((String)hotelSeleccionat.get("nomHotel")) == 0) {
				trobat = true;
			}
		}
		Map<String, Object> dadesHabs = new TreeMap<String, Object>();
		dadesHabs.put("nomHotel", nomHotel);
		dadesHabs.put("descripcio", hotelSeleccionat.get("desc"));
		dadesHabs.put("habs", hotelSeleccionat.get("habs"));
		vrh.actualitzaHabitacions(dadesHabs);
	}
	
	public void habitacioSeleccionada() {
		vrh.desbloquejarBotoReserva();
	}
	
	public void reservarCerca(String hotel, String tipusHab) {
		try {
			Map<String, Object> dadesReserva = curh.selecionarHabitacio(hotel, tipusHab);
			vrh.mostraWizardIdentificacio(dadesReserva);
		} catch (HotelNoExisteix exc) {
			vrh.mostraMissatge(exc.getMessage(), "");
		}
	}
	
	public void reservarIdentificacio(String dni) {
		if(!dni.isEmpty()) {
			try {
				Map<String, Object> dadesReserva = curh.introduirDni(dni);
				vrh.canviarAPagament(dadesReserva);
			} catch (ClientNoExisteix exc) {
				String missatge = "El client amb dni" + dni + "no existeix.";
				vrh.mostraMissatge(missatge, "");
			}
		}
	}
	
	public void reservarPagament(String numTarg, Date dCad) {
		if(!numTarg.isEmpty()) {
			try {
				curh.pagament(numTarg, dCad);
				vrh.mostraMissatge("La reserva s'ha realitzat correctament.", "");
			} catch (ServeiNoDisponible exc) {
				vrh.mostraMissatge(exc.getMessage(), "");
			} catch (ClientNoExisteix exc) {
				vrh.mostraMissatge(exc.getMessage(), "");
			} catch (HabitacioNoExisteix exc) {
				vrh.mostraMissatge(exc.getMessage(), "");
			}
		}
	}
	
	public void enrere() {
		vrh.canviarAIdentificacio();
	}
	
}
